#include "bsp_epittimer.h"
#include "bsp_int.h"
#include "bsp_led.h"

/**
 *  @brief  EPIT1中断处理函数
 *  @param  无
 *  @retval 无
 */
void epit1_irqhandler(void)
{
    static uint8_t state=0;

    state = !state;
    if(EPIT1->SR & (1<<0))  //判断比较事件发生
    {   
        led_switch(LED0,state);   //定时周期到,反转LED
        
    }
    EPIT1->SR |= (1<<0);   //清除中断标志位
}



/**
 * @brief 初始化EPIT定时器   EPIT定时器是32位向下计数器,时钟源使用ipg=66MHz   这里对中断服务函数进行了注册
 * @param frac 分频值,范围为0~4095,分别对应1~4096分频
 * @param value 倒计时值
 * @retval 无 
 */
void epit1_init(uint32_t frac, uint32_t value)
{
    if(frac > 0xFFF) 
    {   //
        frac=0xFFF;
    }
    EPIT1->CR=0;   //先清零CR寄存器

    /**
     * CR寄存器:
     * bit25:24     01时钟源选择Peripheral clock=66MHz
     * bit15:4      frac 分频值
     * bit3:        1 当计数器到0的话从LR重新加载数值   set-and-forget模式  当计数器计数到0,那么就会从加载寄存器EPITx_LR中重新加载数据到计数器中
     * bit2:        1 比较中断使能
     * bit1:        1 初始计数值来源于LR寄存器值
     * bit0:        0 先关闭EPIT1        
     */
    EPIT1->CR=(1<<24 | frac<<4 | 1<<3 | 1<<2 | 1<<1);
    EPIT1->LR=value;    //加载寄存器值    加载寄存器EPITx_LR
    EPIT1->CMPR=0;      //比较寄存器值    就是从valu开始相减,减到0时就产生中断
    GIC_EnableIRQ(EPIT1_IRQn);  //使能EPIT1输出比较中断   相当于使能总中断

    /*注册中断服务函数*/
    system_register_irqhandler(EPIT1_IRQn,(system_irq_handler_t)epit1_irqhandler,NULL);
    EPIT1->CR |= 1<<0;      //使能EPIT1
}



/********************上面中断频率计算公式如下**********************/
//     Tout = ((frac +1) * value) /Tclk   
//     也就是中断的频率为  Tclk/((frac+1)*value)
//     比如要实现500ms的中断周期  EPIT1的时钟源为66MHz 1分频   则EPIT1的加载寄存器就应该为  value= 66000000/2=33000000

        